package Blog;

import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

import static java.lang.Thread.sleep;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)

public class BlogCases extends InitAndEnd{
    public static Stream<Arguments> Generator_detail() {
        return Stream.of(Arguments.arguments(
                "http://localhost:8080/blog_system-2/blog_detail.html?blogId=12",
                "博客详情页",
                "自动化测试"));
    }

    /**
     * 测试用例 1： 输入正确的账号，密码  ----> 登陆成功
     */
    @Order(1)
    @ParameterizedTest
    @CsvFileSource(resources = "LoginSuccess.csv")
    void LoginSuccess(String username, String password, String blog_list_url){
        System.out.println(username + password + blog_list_url);
        // 打开博客登录页面
        webDriver.get("http://localhost:8080/blog_system-2/login.html");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 输入账号 zhangsan
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 输入密码 123
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 点击提交按钮
        webDriver.findElement(By.cssSelector("#submit")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 跳转到列表页
        // 获取到当前页面的 cur_url
        String cur_url = webDriver.getCurrentUrl();
        // 如果 cur_url 等于列表页对应的值，则测试通过，否则不通过
        Assertions.assertEquals(blog_list_url, cur_url);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 如果列表页展示用户信息是 zhangsan，测试时通过，否则失败
        String cur_name = webDriver.findElement(By.cssSelector
                ("body > div.container > div.container-left > div > h3")).getText();
        Assertions.assertEquals(username, cur_name);
    }

    /**
     * 测试用例 2：测试 博客列表博客数量 已经发布的博客数量不为 0
     */
    @Order(2)
    @Test
    void BlogList() throws InterruptedException {
        // 打开博客列表页
        webDriver.get("http://localhost:8080/blog_system-2/blog_list.html");
        /*webDriver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123");
        webDriver.findElement(By.cssSelector("#submit")).click();*/
//        sleep(3000);

        // 获取页面上所有博客标题对应的元素
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        int title_num = webDriver.findElements(By.cssSelector(".title")).size();
        System.out.println(title_num);

        // 如果元素数量不为 0，测试通过
        Assertions.assertNotEquals(0, title_num);
    }

    /**
     * 测试用例 3：博客详情页的校验
     * url、博客标题、页面的 title是 “博客详情页”
     */
    @Order(3)
    @ParameterizedTest
    @MethodSource("Generator_detail")
    void BlogDetail(String expected_url, String expected_title, String expected_blog_title) throws InterruptedException {
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 找到第一篇博客对应的 查看全文 的按钮
        webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 获取当前页面 url
        String cur_url = webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 获取当前页面 title
        String cur_title = webDriver.getTitle();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        // 获取博客页面 标题
        String cur_blog_title = webDriver.findElement(
                By.cssSelector("body > div.container > div.container-right > h3")).getText();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

        Assertions.assertEquals(expected_url, cur_url);
        Assertions.assertEquals(expected_title, cur_title);
        Assertions.assertEquals(expected_blog_title, cur_blog_title);
        if(cur_blog_title.contains(expected_blog_title)) {
            System.out.println("测试通过");
        } else {
            System.out.println("测试不通过");
        }
    }

    /**
     * 测试用例 4：写博客
     */
    /*@Test
    @Order(4)
    void EditBlog() throws InterruptedException {
        // 打开博客列表页
        *//*webDriver.get("http://localhost:8080/blog_system-2/blog_list.html");
        webDriver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123");
        webDriver.findElement(By.cssSelector("#submit")).click();*//*
//        sleep(3000);
        // 找到写博客按钮，点击
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 通过 js 将标题进行输入，需要将 webDriver 进行强制转换为 JavascriptExecutor 类型
        ((JavascriptExecutor)webDriver).executeScript(
                "document.getElementById(\"title\").value=\"自动化测试\"");
        sleep(3000);
        // 点击发布
        webDriver.findElement(By.cssSelector("#submit")).click();
        sleep(3000);
        // 进行校验
        // 获取当前的 url
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals(
                "http://localhost:8080/blog_system-2/blog_list.html", cur_url);
    }*/

    /**
     * 测试用例 5：校验已发布博客的标题
     *           校验已发布博客的时间
     */
    @Test
    @Order(5)
    void BlogInfoChecked() {
        webDriver.get("http://localhost:8080/blog_system-2/blog_list.html");
        /*webDriver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123");
        webDriver.findElement(By.cssSelector("#submit")).click();*/
        // 获取第 1篇博客的标题
        String first_blog_title = webDriver.findElement(By.cssSelector("body > div.container > div.container-right > div:nth-child(1) > div.title"))
                .getText();
        // 获取第 1 篇博客的时间
        String cur_time = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[2]")).getText();
        // 校验博客标题
        Assertions.assertEquals("自动化测试", first_blog_title);
        // 如果时间是 2023-06-08，则测试通过
//        Assertions.assertEquals("2023-06-08", cur_time);
        if (cur_time.contains("2023-06-08")) {
            System.out.println("测试通过");
        } else {
            System.out.println("当前时间是：" + cur_time);
            System.out.println("测试不通过");
        }
    }

    /**
     * 测试用例 6：删除刚才发布的博客
     */
   /* @Test
    @Order(6)
    void DeleteBlog() {
        // 打开博客列表页面
        webDriver.get("http://localhost:8080/blog_system-2/blog_list.html");
        // 点击全文按钮
        webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();
        // 点击删除按钮，删除之后页面跳转到博客列表页
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)")).click();
        // 博客列表页第一篇博客标题不是“自动化测试”
        // DEBUG：因为此时没有写删除博客页面的代码，所以会出现测试失败
        String cur_blog_title = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[2]/div[1]")).getText();
        Assertions.assertNotEquals(cur_blog_title, "自动化测试");

    }*/

    /**
     * 测试用例 7：针对 “注销” 功能进行测试。
     * 点击注销用户就会退出，页面跳转到登录页面，登录页面的账号和密码为空
     */
    @Test
    @Order(7)
    void Logout() {
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        // 校验 1： url（登录的）
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://localhost:8080/blog_system-2/login.html", cur_url);
        // 校验 2： 校验提交按钮
        WebElement webElement = webDriver.findElement(By.cssSelector("#submit"));
        Assertions.assertNotNull(webElement);
    }
}
